import pandas as pd
from jieba import *
from fuzzywuzzy import fuzz
from fuzzywuzzy import process

# 获取数据
def get_data():
    loc = 'E:/sunx/碰撞场景分类/test_data.xlsx'
    data = pd.read_excel(loc,index_col=0) # 第一列作为行索引
    return data
# data_()
Geo = get_data()
cond1 = (Geo['处理状态'] == '核实误报')
cond2 = (Geo['处理状态'] == '核实事故')
# 核实误报数据
Geo_Mis = Geo[cond1]
# 核实事故数据
Geo_acci = Geo[cond2]
# print(Geo_Mis,Geo_acci)

# 对地址列进行分词写入dataframe
def cut_(item):
    # 存在float类型，转成字符串在进行分词
    list = cut(str(item), cut_all=False)
    cut_ = [x for x in list]
    return cut_

# 误报数据
Geo_Mis['cut'] = Geo_Mis['地址'].apply(cut_)
Geo_Mis['cut1'] = Geo_Mis['cut'].apply(lambda x : x[3:])
# 事故数据
Geo_acci['cut'] = Geo_acci['地址'].apply(cut_)
Geo_acci['cut1'] = Geo_acci['cut'].apply(lambda x : x[3:])

# 场景分类列表
scene_list = ['幼儿园', '小学', '中学', '大学', '学校', '医院', '加油站', '服务区', '站',   #标志建筑,站为车站等，优先级低于加油站
              '小区', '苑', '社区', '公寓', '店', '庄', '馆', '广场', '花园', '购物中心', '景点', '旅游', '大厦', '公司', '厂',  #普通建筑
              '快速','高速', '县道', '市道', '省道', '国道',  # 高速路
              '大道', '路', '桥', '隧道', '村', '乡']   # 低速路

scene_list_0 = ['学校', '学校', '学校', '学校', '学校', '医院', '加油站', '服务区', '车站',   #标志建筑
              '居住区域', '居住区域', '居住区域', '居住区域', '餐馆', '餐馆', '餐馆', '休闲区域','休闲区域', '商业楼', '旅游区', '旅游区', '办公楼', '办公楼', '工厂',  #普通建筑
              '快速','高速', '县道', '市道', '省道', '国道',  # 高速路
              '城市干道', '支路', '桥梁', '隧道', '乡村道路', '乡村道路']   # 低速路

scene_dict = {
    '学校': [0,1,2,3,4], '医院': [5], '加油站': [6], '服务区': [7], '车站': [8],
    '居住区域': [9,10,11,12],'公共场所': [13,14,15,16,17,18,19,20], '办公楼/工厂': [21,22,23],
    '快速路段': [24,25,26,27,28,29], '低速路段': [30,31,32,33,34,35]
}


# 计算相似度一维矩阵
def Similarity(Entry):
    Similarity_list = []
    for i in scene_list:
        Similarity_list.append(fuzz.partial_ratio(Entry,i))
    return Similarity_list

Geo_Mis['Similarity'] = Geo_Mis['cut1'].apply(Similarity)
Geo_acci['Similarity'] = Geo_acci['cut1'].apply(Similarity)

# 返回相似度最高的分类
def scene(matrix):
    # 相似度初始值
    max = 0
    # -1表示没有相似的分类
    max_num = -1
    for p in range(len(matrix)):
        if matrix[p] > max:
            max = matrix[p]
            max_num = p
            # print(max,p)
    return max_num

Geo_Mis['scene'] = Geo_Mis['Similarity'].apply(scene)
Geo_acci['scene'] = Geo_acci['Similarity'].apply(scene)

# 定义返回对应类别函数
def get_category(num_):
    if num_ == -1:
        return '其他'
    else:
        return scene_list_0[num_]

# 取子类编号列表
num_list = list(Geo_acci['scene'])
# print(num_list0)
# for o in range(len(list(scene_dict.values()))):
#     print(list(scene_dict.values())[o])
# 返回场景大类
category0 = []
# def get_category0():
#     for num__ in num_list:
#         # print(num__)
#         for n in range(len(list(scene_dict.values()))):
#             if num__ in list(scene_dict.values())[n]:
#                 return list(scene_dict.keys())[n]
#             else:
#                 continue

for num__ in num_list:
    # print(num__)
    for n in range(len(list(scene_dict.values()))):
        if num__ in list(scene_dict.values())[n]:

            category0.append(list(scene_dict.keys())[n])
            break

    category0.append('-1')

# print(category0)
Geo_Mis['category'] = Geo_Mis['scene'].apply(get_category)
Geo_acci['category'] = Geo_acci['scene'].apply(get_category)

# Geo_Mis['category0'] = Geo_Mis['scene'].apply(get_category0)
# Geo_acci['category0'] = Geo_acci['scene'].apply(get_category0)
# Geo_acci['category0'] = category0
print(len(category0), len(Geo_acci))
# Geo_acci.insert(loc = -1, # 插入位置
#                 column='category1', # 插入一列，这一列名字
#                 value = category0) # 插入的值

print(Geo_Mis, Geo_acci)
#
# Geo_Mis.to_csv('E:/sunx/碰撞场景分类/Mis_test3_data.csv')
# Geo_acci.to_csv('E:/sunx/碰撞场景分类/acci_test3_data.csv')